package t

var stack []int
func push(val int) {
	stack = append(stack, val)
}
//从栈中获取数据
func pop() (int, bool) {
	ok := false
	value := 0
	if len(stack) > 0 {
		value = stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		ok = true
		return value, ok
	} else {
		return value, ok
	}
}

func IsValid(s string) bool {
	// strMap := map[int]string{
	//	// 	40 : "(",
	//	// 	41 : ")",
	//	// 	123 : "{",
	//	// 	125 : "}",
	//	// 	91 : "[",
	//	// 	93 : "]",
	//	// }
	// str := "[({(())}[()])]"
	l := 0
	r := len(s)
	for(l < r) {
		if l == 0 {
			push(int(s[l]))
			l++
			continue
		}
		val,ok := pop()
		if ok {
			switch val {
			case 40:
				if s[l] != 41 {
					push(val)
					push(int(s[l]))
				}
				break
			case 123:
				if s[l] != 125 {
					push(val)
					push(int(s[l]))
				}
				break
			case 91:
				if s[l] != 93 {
					push(val)
					push(int(s[l]))
				}
				break
			default:
				push(val)
				break
			}
		}else {
			push(int(s[l]))
		}
		l++
	}
	if len(stack) == 0 {
		return true
	}

	return false
}
